package com.pet.shop.service.option;

import com.pet.exceptions.BusinessException;
import com.pet.shop.entity.option.DataOption;
import com.pet.shop.entity.option.DataOptionVal;
import com.pet.shop.entity.option.DataOptionView;
import com.pet.shop.mappers.option.DataOptionMapper;
import com.pet.shop.mappers.option.DataOptionValMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * Created by candy.zhao on 2016-11-8.
 */
@Service
public class DataOptionServiceImpl implements IDataOptionService {

    @Autowired
    private DataOptionValMapper dataOptionValMapper;
    @Autowired
    private DataOptionMapper dataOptionMapper;

    @Override
    public void insertDataOptionVal(DataOptionVal dataOptionVal) {
        if(dataOptionVal == null){
            throw new BusinessException("要新增的设置信息为空");
        }
        if(dataOptionVal.getUserId() == null || dataOptionVal.getDataOptionId() == null){
            throw new BusinessException("要新增的设置信息为空");
        }

        DataOption dataOption = dataOptionMapper.fetch(dataOptionVal.getDataOptionId());
        if(dataOption == null){
            throw new BusinessException("要新增的设置信息不存在");
        }
        if(dataOption.getDataKey().equals("out_meal_time")){
            try{
                Long seconds = Long.parseLong(dataOptionVal.getValue());
                if(seconds <= 2 * 60 || seconds > 60 * 60){
                    throw new BusinessException("出餐时间请在一个小时以内且大于2分钟");
                }
            }catch (Exception e){
                throw new BusinessException("出餐时间设置必须是数字，单位秒");
            }
        }

        DataOptionVal serverVal = dataOptionValMapper.queryByUserIdOptionId(dataOptionVal.getUserId(), dataOptionVal.getDataOptionId());
        if(serverVal != null){
            dataOptionVal.setId(serverVal.getId());
            updateDataOptionVal(dataOptionVal);
            return;
        }

        dataOptionVal.setCreateTime(new Date());
        dataOptionValMapper.insert(dataOptionVal);
    }

    @Override
    public void updateDataOptionVal(DataOptionVal dataOptionVal) {
        if(dataOptionVal == null){
            throw new BusinessException("要更新的设置信息为空");
        }
        DataOption dataOption = dataOptionMapper.fetch(dataOptionVal.getDataOptionId());
        if(dataOption == null){
            throw new BusinessException("要更新的设置信息不存在");
        }
        if(dataOption.getDataKey().equals("out_meal_time")){
            try{
                Long seconds = Long.parseLong(dataOptionVal.getValue());
                if(seconds <= 0 || seconds > 60 * 60){
                    throw new BusinessException("出餐时间请在一个小时以内");
                }
            }catch (Exception e){
                throw new BusinessException("出餐时间设置必须是数字，单位秒");
            }
        }
        dataOptionVal.setModifyTime(new Date());
        dataOptionValMapper.update(dataOptionVal);
    }

    @Override
    public void saveDataOptionVal(List<DataOptionVal> dataOptionValList) {
        for(DataOptionVal dataOptionVal : dataOptionValList){
            if(dataOptionVal.getId() != null){
                updateDataOptionVal(dataOptionVal);
            }else{
                insertDataOptionVal(dataOptionVal);
            }
        }
    }

    @Override
    public List<DataOptionView> queryDataOptionValByTypeId(Long userId, Integer dataType) {
        //先查询选项类型
        List<DataOption> dataOptions = dataOptionMapper.queryByDataType(dataType);
        if(dataOptions == null || dataOptions.isEmpty()) return new ArrayList<DataOptionView>();
        //查询值
        List<DataOptionVal> valList = dataOptionValMapper.queryValByDataTypeUserId(userId, dataType);

        //组装数据
        Map<Long, DataOptionVal> valMap = new HashMap<Long, DataOptionVal>();
        if(valList != null) for(DataOptionVal val : valList){
            valMap.put(val.getDataOptionId(), val);
        }

        List<DataOptionView> results = new ArrayList<DataOptionView>();
        for(DataOption dataOption : dataOptions){
            DataOptionView dto = new DataOptionView(dataOption);
            dto.updateVal(valMap.get(dataOption.getId()));
            results.add(dto);
        }

        return results;
    }

    @Override
    public DataOptionView queryDataOptionValByKeyId(Long userId, String key) {
        //先查询选项类型
        DataOption dataOption = dataOptionMapper.queryByDataKey(key);
        if(dataOption == null) return null;
        //查询值
        DataOptionVal val = dataOptionValMapper.queryByUserIdOptionId(userId, dataOption.getId());
        DataOptionView dto = new DataOptionView(dataOption);
        dto.updateVal(val);
        return dto;
    }

    @Override
    public List<DataOptionView> queryDataOptionValByTypeUserId(Long userId, Integer dataType) {
        //先查询选项类型
        List<DataOption> dataOptions = dataOptionMapper.queryByDataType(dataType);
        if(dataOptions == null || dataOptions.isEmpty()) return new ArrayList<DataOptionView>();
        //查询值
        List<DataOptionVal> valList = dataOptionValMapper.queryValByDataTypeUserId(userId, dataType);

        //组装数据
        Map<Long, DataOptionVal> valMap = new HashMap<Long, DataOptionVal>();
        if(valList != null) for(DataOptionVal val : valList){
            valMap.put(val.getDataOptionId(), val);
        }

        List<DataOptionView> results = new ArrayList<DataOptionView>();
        for(DataOption dataOption : dataOptions){
            DataOptionView dto = new DataOptionView(dataOption);
            dto.updateVal(valMap.get(dataOption.getId()));
            results.add(dto);
        }

        return results;
    }

    @Override
    public Map<String, String> queryDataOptionValMapByTypeId(Long userId, Integer dataType) {
        List<DataOptionView> results = queryDataOptionValByTypeId(userId, dataType);
        Map<String, String> resultMap = new HashMap<String, String>();
        if(results != null) for(DataOptionView dataOptionDTO : results){
            resultMap.put(dataOptionDTO.getDataKey(), dataOptionDTO.getValue());
        }
        return resultMap;
    }
}
